由於後續要做註冊及登入,所以呢,今天先來將註冊登入會用到的資料庫 migration 檔建立起來。
一般來說,在建立資料庫的 Schema 時,一種最簡單的方式,就是直接進到資料庫手動建立,看起來方便,但其實不好,原因是因為下次若要再重新建立的時候,會不知道之前建立的步驟,所以會有重建上的麻煩。
所以 migration 檔的好處:將資料庫 schema 寫在程式裡,這樣之後要重建的話,直接執行指令即可。
另外也可以有 seed 檔案,可以透過程式的方式,直接埋入資料。
以下就讓我們透過 Docker 的方式,所以需先進到 container 容器裡,然後在 webmix_api 資料夾下,建立 migration 檔及 seed 檔。
該套件的官網在這。
在 webmix_api 資料夾下,執行以下指令,來自動建立設定檔及資料夾:
deno run -A --unstable https://deno.land/x/nessie/cli.ts init --dialect mysql
執行完之後,會產生 nessie.config.ts 設定檔,然後裡面的資料庫資訊需做更改,完成的原始碼如下:
import {
ClientMySQL,
NessieConfig,
} from "https://deno.land/x/nessie@2.0.7/mod.ts";
const client = new ClientMySQL({
hostname: Deno.env.get("HOSTNAME"),
port: parseInt(Deno.env.get("PORT")),
username: Deno.env.get("USERNAME"),
password: Deno.env.get("DB_PASSWORD"),
db: Deno.env.get("DB"),
});
/** This is the final config object */
const config: NessieConfig = {
client,
migrationFolders: ["./db/migrations"],
seedFolders: ["./db/seeds"],
};
export default config;
除了設定檔之外,也會自動產生 db 資料夾,該資料夾裡,會有 migrations 資料夾及 seeds 資料夾。
接下來就是執行產生 migration 檔的指令及 seed 檔的指令。
deno run -A --unstable https://deno.land/x/nessie/cli.ts make:migration create_users
然後就會在 migrations 資料夾下,自動產生 20220916042119_create_users.ts 檔案,然後該檔案裡面呢,我們就寫些 sql,完整原始碼如下:
import { AbstractMigration, Info, ClientMySQL } from "https://deno.land/x/nessie@2.0.7/mod.ts";
export default class extends AbstractMigration<ClientMySQL> {
/** Runs on migrate */
async up(info: Info): Promise<void> {
await this.client.query("CREATE TABLE roles(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,role_name varchar(10))");
await this.client.query(
`
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
role_id INT NOT NULL,
nickname VARCHAR(20),
email VARCHAR(10),
password VARCHAR(255),
created_at TIMESTAMP,
CONSTRAINT roles_role_id_fk FOREIGN KEY (role_id) REFERENCES roles (id)
)
`);
}
/** Runs on rollback */
async down(info: Info): Promise<void> {
await this.client.query("DROP TABLE users");
await this.client.query("DROP TABLE roles");
}
}
從上述的程式碼來看,其實就是建立 roles 及 users 兩個資料表而已。
然後該怎麼執行呢,執行以下 migrate 指令即可:
deno run -A --unstable https://deno.land/x/nessie/cli.ts migrate
然後就可以到資料庫中,看資料庫是否有建立對應的資料表(roles 和 users)囉。
如果想復原,那就執行以下的 rollback 指令:
deno run -A --unstable https://deno.land/x/nessie/cli.ts rollback
建立 seed 檔,執行以下指令:
deno run -A --unstable https://deno.land/x/nessie/cli.ts make:seed add_roles
那麼就會在 seeds 資料夾下,自動產生 add_roles.ts 檔案,那該檔裡的程式呢,我們就是加上 sql 來做新增資料,原始碼如下:
import { AbstractSeed, Info, ClientMySQL } from "https://deno.land/x/nessie@2.0.7/mod.ts";
export default class extends AbstractSeed<ClientMySQL> {
/** Runs on seed */
async run(info: Info): Promise<void> {
await this.client.query("INSERT INTO roles(id, role_name) VALUES (1, '管理者')");
await this.client.query("INSERT INTO roles(id, role_name) VALUES (2, '一般會員')");
}
}
那麼要如何執行 seed 檔呢,執行以下指令即可:
deno run -A --unstable https://deno.land/x/nessie/cli.ts seed add_roles.ts
然後就可以到資料庫中,看 roles 資料表,是否有建立對應的資料囉。
資料庫建立好了基本的 schema,而且是透過 migration 來建立,以後就方便做資料庫的移轉或重建。
後續就可以來寫註冊會員的 GraphQL API 了。